package dames;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Hashtable;
import java.util.Set;

import org.omg.CORBA.ORB;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.POAPackage.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;

import dames.gen.gestionnaire_de_partiesPOA;
import dames.gen.joueur;
import dames.gen.nomDePartieInexistant;
import dames.gen.nomDePartieReserve;
import dames.gen.partie;
import dames.gen.partieHelper;
import dames.gen.partieNonDisponible;
import dames.gen.partiePackage.enumEtat;

class gestionnaire_de_partiesImpl extends gestionnaire_de_partiesPOA {	

	Hashtable<String, partieImpl> htParties = new Hashtable<String, partieImpl>();
	
	// Reference sur la POA
	//
	protected POA _poa;
	
	
	public gestionnaire_de_partiesImpl(POA poa) {
		_poa = poa;
	}

	@Override
	public String[] listeNomsParties() {
		Set<String> keySet = htParties.keySet();
		String[] noms = new String[keySet.size()];
		noms = keySet.toArray(noms);
		return noms;
	}

	@Override
	public partie creation_d_une_partie(joueur pions_blancs, String nom_de_la_partie) throws nomDePartieReserve{
		if(htParties.get(nom_de_la_partie) != null) throw new nomDePartieReserve();
		partieImpl partie = new partieImpl(pions_blancs, _poa);
		htParties.put(nom_de_la_partie, partie);
		org.omg.CORBA.Object ref = null;
		try {
			ref = _poa.servant_to_reference(partie);
		} catch (ServantNotActive e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (WrongPolicy e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	return partieHelper.narrow(ref);
	}

	@Override
	public partie ajouter_joueur_pions_noirs(joueur pions_noirs, String nom_de_la_partie) throws nomDePartieInexistant, partieNonDisponible{
		partieImpl partie = htParties.get(nom_de_la_partie);
		if(partie == null) throw new nomDePartieInexistant();
		if(partie.etat() != enumEtat.ATTENTE_PIONS_NOIRS) throw new partieNonDisponible();
		partie.setNoirs(pions_noirs);
		
		partie.blancs().a_toi_de_jouer();
		
		org.omg.CORBA.Object ref = null;
		try {
			ref = _poa.servant_to_reference(partie);
		} catch (ServantNotActive e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (WrongPolicy e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return partieHelper.narrow(ref);
	}
	
    public static void main(String[] args) throws IOException {
        
        try {
            //init ORB
            ORB orb = ORB.init(args, null);

            //init POA
            POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
            poa.the_POAManager().activate();

            ////////////////////////////////////////////////////////////////
            gestionnaire_de_partiesImpl gestpartimpl = new gestionnaire_de_partiesImpl(poa);
            org.omg.CORBA.Object gestpart = poa.servant_to_reference(gestpartimpl);

            try {
                String gest_ref = orb.object_to_string(gestpart);
                String refFile = "gestion.ref";
                PrintWriter out = new PrintWriter(new FileOutputStream(refFile));
                out.println(gest_ref);
                out.close();
            } catch (IOException ex) {
                System.err.println(
                    "Impossible d'ecrire la reference dans gestion.ref");
                System.exit(1);
            }

            System.out.println("Le serveur est pret ");

            orb.run();

            System.exit(0);
        }
        catch (Exception e) {
            System.out.println(e);
        }
    }


}

